<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深入解析 Guava Cache：Google 工程师的缓存艺术</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
        }
        
        /* 首字下沉效果 */
        .drop-cap::first-letter {
            float: left;
            font-size: 4.5rem;
            line-height: 3.5rem;
            padding-right: 0.5rem;
            margin-top: 0.25rem;
            font-weight: 700;
            color: #4f46e5;
            font-family: 'Noto Serif SC', serif;
        }
        
        /* 代码块美化 */
        pre {
            background: linear-gradient(135deg, #1e293b 0%, #334155 100%);
            border-radius: 12px;
            padding: 1.5rem;
            overflow-x: auto;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
            position: relative;
        }
        
        pre::before {
            content: '';
            position: absolute;
            top: 0.75rem;
            left: 1rem;
            width: 12px;
            height: 12px;
            background: #ef4444;
            border-radius: 50%;
            box-shadow: 20px 0 0 #eab308, 40px 0 0 #22c55e;
        }
        
        code {
            color: #e2e8f0;
            font-family: 'Fira Code', 'Consolas', monospace;
            font-size: 0.9rem;
            line-height: 1.6;
        }
        
        /* 引用块样式 */
        .quote-block {
            position: relative;
            padding: 2rem 3rem;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border-radius: 16px;
            margin: 3rem 0;
            box-shadow: 0 20px 40px rgba(102, 126, 234, 0.3);
        }
        
        .quote-block::before {
            content: '\f10d';
            font-family: 'Font Awesome 6 Free';
            font-weight: 900;
            position: absolute;
            top: 1rem;
            left: 1.5rem;
            font-size: 2rem;
            opacity: 0.3;
        }
        
        /* 章节标题样式 */
        .section-title {
            position: relative;
            padding-left: 1.5rem;
            margin: 3rem 0 2rem 0;
        }
        
        .section-title::before {
            content: '';
            position: absolute;
            left: 0;
            top: 50%;
            transform: translateY(-50%);
            width: 6px;
            height: 100%;
            background: linear-gradient(180deg, #4f46e5 0%, #7c3aed 100%);
            border-radius: 3px;
        }
        
        /* 卡片悬停效果 */
        .hover-card {
            transition: all 0.3s ease;
        }
        
        .hover-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
        }
        
        /* 列表样式美化 */
        .custom-list li {
            position: relative;
            padding-left: 2rem;
            margin-bottom: 1rem;
        }
        
        .custom-list li::before {
            content: '\f00c';
            font-family: 'Font Awesome 6 Free';
            font-weight: 900;
            position: absolute;
            left: 0;
            color: #4f46e5;
        }
        
        /* Mermaid 图表样式 */
        .mermaid {
            background: white;
            padding: 2rem;
            border-radius: 12px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
            margin: 2rem 0;
        }
        
        /* 滚动动画 */
        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }
        
        .animate-fade-in {
            animation: fadeInUp 0.8s ease-out;
        }
    </style>
</head>
<body>
    <!-- Hero 区域 -->
    <div class="relative overflow-hidden bg-gradient-to-br from-indigo-600 via-purple-600 to-pink-500 text-white">
        <div class="absolute inset-0 bg-black opacity-20"></div>
        <div class="relative max-w-7xl mx-auto px-4 py-24 sm:px-6 lg:px-8">
            <div class="text-center animate-fade-in">
                <h1 class="text-5xl md:text-7xl font-bold mb-6 tracking-tight">
                    深入解析 Guava Cache
                </h1>
                <p class="text-2xl md:text-3xl mb-8 font-light opacity-90">
                    Google 工程师的缓存艺术
                </p>
                <div class="flex justify-center space-x-6 text-lg">
                    <span class="flex items-center">
                        <i class="fas fa-clock mr-2"></i>
                        阅读时间：15分钟
                    </span>
                    <span class="flex items-center">
                        <i class="fas fa-code mr-2"></i>
                        技术深度：高级
                    </span>
                </div>
            </div>
        </div>
        <div class="absolute bottom-0 left-0 right-0">
            <svg viewBox="0 0 1440 120" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path d="M0 120L60 105C120 90 240 60 360 45C480 30 600 30 720 37.5C840 45 960 60 1080 67.5C1200 75 1320 75 1380 75L1440 75V120H1380C1320 120 1200 120 1080 120C960 120 840 120 720 120C600 120 480 120 360 120C240 120 120 120 60 120H0Z" fill="white"/>
            </svg>
        </div>
    </div>

    <!-- 主要内容区域 -->
    <div class="max-w-5xl mx-auto px-4 py-12 sm:px-6 lg:px-8">
        <!-- 引言 -->
        <div class="quote-block animate-fade-in">
            <p class="text-xl leading-relaxed">
                在我十多年的Java开发生涯中，Guava的Cache可能是我用过的最让人省心的本地缓存实现了。没有之一。今天咱们就来扒一扒它的源码，看看Google工程师是怎么把这个看似简单的功能实现得这么优雅的。
            </p>
        </div>

        <!-- 第一章节 -->
        <section class="mb-16">
            <h2 class="section-title text-3xl font-bold text-gray-800">
                1. 为什么需要本地缓存？
            </h2>
            
            <div class="bg-white rounded-xl p-8 shadow-lg hover-card mb-8">
                <p class="text-lg text-gray-700 mb-6 drop-cap">
                    在日常开发中，我们经常会遇到需要频繁获取相同数据的场景。比如：
                </p>
                
                <ul class="custom-list text-gray-700 mb-6">
                    <li>配置信息读取</li>
                    <li>重复计算的结果缓存</li>
                    <li>数据库查询结果缓存</li>
                    <li>远程服务调用结果缓存</li>
                </ul>
                
                <p class="text-lg text-gray-700 leading-relaxed mb-4">
                    如果每次都从原始数据源获取，不仅效率低下，还会给底层系统带来不必要的压力。本地缓存就是为解决这类问题而生的。
                </p>
                
                <p class="text-lg text-gray-700 leading-relaxed">
                    Guava Cache提供了一种高效、线程安全的本地缓存解决方案，它介于手动实现的HashMap和分布式缓存(如Redis)之间，非常适合单机环境下的缓存需求。
                </p>
            </div>
        </section>

        <!-- 第二章节 -->
        <section class="mb-16">
            <h2 class="section-title text-3xl font-bold text-gray-800">
                2. LoadingCache实现原理与淘汰策略
            </h2>
            
            <div class="grid md:grid-cols-2 gap-8 mb-8">
                <div class="bg-white rounded-xl p-6 shadow-lg hover-card">
                    <h3 class="text-xl font-bold text-gray-800 mb-4 flex items-center">
                        <i class="fas fa-cube text-indigo-600 mr-3"></i>
                        2.1 核心接口设计
                    </h3>
                    <p class="text-gray-700 mb-4">
                        Guava Cache的核心是<code class="bg-gray-100 px-2 py-1 rounded text-sm">Cache</code>接口，它定义了缓存的基本操作：
                    </p>
                </div>
                
                <div class="bg-white rounded-xl p-6 shadow-lg hover-card">
                    <h3 class="text-xl font-bold text-gray-800 mb-4 flex items-center">
                        <i class="fas fa-database text-purple-600 mr-3"></i>
                        2.2 数据结构与存储机制
                    </h3>
                    <p class="text-gray-700">
                        深入源码会发现，Guava Cache的底层存储结构是一个基于分段锁的并发哈希表（类似于JDK 7中的ConcurrentHashMap实现）。
                    </p>
                </div>
            </div>

            <pre><code>public interface Cache&lt;K, V&gt; {
  V getIfPresent(Object key);
  V get(K key, Callable&lt;? extends V&gt; valueLoader);
  void put(K key, V value);
  void invalidate(Object key);
  // 其他方法...
}</code></pre>

            <p class="text-lg text-gray-700 my-6">
                而<code class="bg-gray-100 px-2 py-1 rounded">LoadingCache</code>是它的扩展，增加了自动加载值的能力：
            </p>

            <pre><code>public interface LoadingCache&lt;K, V&gt; extends Cache&lt;K, V&gt; {
  V get(K key) throws ExecutionException;
  ImmutableMap&lt;K, V&gt; getAll(Iterable&lt;? extends K&gt; keys) throws ExecutionException;
  // 其他方法...
}</code></pre>

            <div class="bg-gradient-to-r from-blue-50 to-indigo-50 rounded-xl p-8 my-8">
                <p class="text-lg text-gray-700 leading-relaxed">
                    说实话，这个接口设计非常优雅，既保留了基本缓存的核心功能，又通过扩展提供了更高级的特性。这也是为什么后来的Caffeine等缓存库在API设计上多少都有Guava Cache的影子。
                </p>
            </div>

            <!-- 缓存架构图 -->
            <div class="mermaid">
                graph TB
                    A[LoadingCache] --> B[Cache接口]
                    A --> C[CacheLoader]
                    B --> D[LocalCache]
                    D --> E[Segment数组]
                    E --> F[ReferenceEntry链表]
                    C --> G[load方法]
                    C --> H[loadAll方法]
                    
                    style A fill:#667eea,stroke:#5a67d8,color:#fff
                    style B fill:#764ba2,stroke:#6b46c1,color:#fff
                    style C fill:#f093fb,stroke:#e879f9,color:#fff
                    style D fill:#4facfe,stroke:#3b82f6,color:#fff
            </div>

            <h3 class="text-2xl font-bold text-gray-800 mt-12 mb-6">2.3 缓存淘汰策略</h3>
            
            <div class="grid md:grid-cols-3 gap-6 mb-8">
                <div class="bg-white rounded-xl p-6 shadow-lg hover-card text-center">
                    <i class="fas fa-weight text-4xl text-indigo-600 mb-4"></i>
                    <h4 class="text-lg font-bold mb-2">基于容量的淘汰</h4>
                    <p class="text-gray-600 text-sm">当缓存数量达到上限时，淘汰最近最少使用的条目</p>
                </div>
                
                <div class="bg-white rounded-xl p-6 shadow-lg hover-card text-center">
                    <i class="fas fa-clock text-4xl text-purple